home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / unix / volume26 / cforms / part01 next >
Encoding:
Text File  |  1992-05-19  |  58.1 KB  |  2,339 lines

  1. Newsgroups: comp.sources.unix
  2. From: lab@techno.sth.cgl.se (Lars Berntzon)
  3. Subject: v26i056: cforms - forms management front end for curses(3), Part01/03
  4. Sender: unix-sources-moderator@pa.dec.com
  5. Approved: vixie@pa.dec.com
  6.  
  7. Submitted-By: lab@techno.sth.cgl.se (Lars Berntzon)
  8. Posting-Number: Volume 26, Issue 56
  9. Archive-Name: cforms/part01
  10.  
  11. [ I tested this as well as I could without having a Sys V.4 system.  It
  12.   looks like it will run on a Sys V.3 system, it basically only needs the
  13.   fancy curses(3).                        --vix ]
  14.  
  15. This is the cforms package ver. 1.1. Cforms is a tool for 
  16. quickly building forms based applications. It handles things
  17. like views, pictures, fields and literals. It is also possible
  18. to use c-code statements for handling various function within
  19. the fields and pictures.
  20.  
  21.     lab@techno.sth.cgl.se (Lars Berntzon)
  22.  
  23. #! /bin/sh
  24. # This is a shell archive.  Remove anything before this line, then unpack
  25. # it by saving it into a file and typing "sh file".  To overwrite existing
  26. # files, type "sh file -c".  You can also feed this as standard input via
  27. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  28. # will see the following message at the end:
  29. #        "End of archive 1 (of 3)."
  30. # Contents:  MANIFEST Makefile README bin doc doc/Makefile example
  31. #   example/Makefile example/test.frm lib patchlevel.h src
  32. #   src/Makefile src/cforms.h src/comp.c src/comp.h src/config.h
  33. #   src/get_ccode.c src/get_event.c src/get_literal.c
  34. #   src/get_picture.c src/get_stmt.c src/get_viewport.c src/keys.h
  35. #   src/skip_stmt.c src/token.h
  36. # Wrapped by vixie@cognition.pa.dec.com on Tue May 19 19:14:28 1992
  37. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  38. if test -f 'MANIFEST' -a "${1}" != "-c" ; then 
  39.   echo shar: Will not clobber existing file \"'MANIFEST'\"
  40. else
  41. echo shar: Extracting \"'MANIFEST'\" \(1057 characters\)
  42. sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
  43. X   File Name        Archive #    Description
  44. X-----------------------------------------------------------
  45. X MANIFEST                   1    
  46. X Makefile                   1    
  47. X README                     1    
  48. X bin                        1    
  49. X doc                        1    
  50. X doc/Makefile               1    
  51. X doc/cforms.tex             2    
  52. X example                    1    
  53. X example/Makefile           1    
  54. X example/test.frm           1    
  55. X lib                        1    
  56. X patchlevel.h               1    
  57. X src                        1    
  58. X src/Makefile               1    
  59. X src/cflib.c                3    
  60. X src/cforms.h               1    
  61. X src/comp.c                 1    
  62. X src/comp.h                 1    
  63. X src/config.h               1    
  64. X src/get_ccode.c            1    
  65. X src/get_event.c            1    
  66. X src/get_field.c            2    
  67. X src/get_literal.c          1    
  68. X src/get_picture.c          1    
  69. X src/get_stmt.c             1    
  70. X src/get_viewport.c         1    
  71. X src/keys.h                 1    
  72. X src/output.c               2    
  73. X src/skip_stmt.c            1    
  74. X src/token.c                2    
  75. X src/token.h                1    
  76. END_OF_FILE
  77. if test 1057 -ne `wc -c <'MANIFEST'`; then
  78.     echo shar: \"'MANIFEST'\" unpacked with wrong size!
  79. fi
  80. # end of 'MANIFEST'
  81. fi
  82. if test -f 'Makefile' -a "${1}" != "-c" ; then 
  83.   echo shar: Will not clobber existing file \"'Makefile'\"
  84. else
  85. echo shar: Extracting \"'Makefile'\" \(1461 characters\)
  86. sed "s/^X//" >'Makefile' <<'END_OF_FILE'
  87. X#
  88. X#        M A K E F I L E
  89. X#        ---------------
  90. X#
  91. X# Description:
  92. X#    Compiles and links CForms
  93. X#
  94. X# $Log:    Makefile,v $
  95. X# Revision 1.7  92/01/25  18:41:38  lasse
  96. X# better export
  97. X# 
  98. X# Revision 1.6  92/01/25  18:35:38  lasse
  99. X# corrected make export
  100. X# 
  101. X# Revision 1.5  92/01/25  18:08:01  lasse
  102. X# Use /usr/local as DEST
  103. X# 
  104. X# 
  105. X# Revision 1.4  92/01/19  13:32:44  lasse
  106. X# added export
  107. X# 
  108. X# Revision 1.3  92/01/19  13:22:09  lasse
  109. X# *** empty log message ***
  110. X# 
  111. X# Revision 1.2  92/01/19  13:21:43  lasse
  112. X# *** empty log message ***
  113. X# 
  114. X# Revision 1.1  92/01/19  13:20:21  lasse
  115. X# Initial revision
  116. X# 
  117. X#
  118. X# By Lars Berntzon (lab@cgl.se)
  119. X#
  120. X
  121. X# 
  122. X# Installation places.
  123. X#
  124. XDEST        = /usr/local
  125. X
  126. XDESTBIN     = $(DEST)/bin
  127. XDESTLIB     = $(DEST)/lib
  128. XDESTINCLUDE = $(DEST)/include
  129. X
  130. XLATEX = latex
  131. XCOMP  = cfc
  132. XOS    = SYSV
  133. X
  134. XMAKE  = make DEST=$(DEST) DESTBIN=$(DESTBIN) DESTLIB=$(DESTLIB) DESTINCLUDE=$(DESTINCLUDE)
  135. X
  136. XDIRS = src doc example
  137. X
  138. Xdefault: src
  139. X
  140. Xall: src doc example
  141. X
  142. Xsrc: src_make
  143. Xsrc_make:
  144. X    (cd src; $(MAKE))
  145. Xdoc: doc_make
  146. Xdoc_make:
  147. X    (cd doc; $(MAKE))
  148. Xexample: example_make
  149. Xexample_make:
  150. X    (cd example; $(MAKE))
  151. X
  152. Xinstall:
  153. X    for i in $(DIRS); do (cd $$i; $(MAKE) install); done
  154. X
  155. Xclean:
  156. X    for i in $(DIRS); do (cd $$i; $(MAKE) clean); done
  157. X    rm -f bin/cfc lib/libcforms.a
  158. Xexport:
  159. X    tar cvf cforms.tar bin lib `find . -type f ! -name RCS ! -name cforms.uu ! -name cforms.tar -print -o -name RCS -prune`
  160. X    compress cforms.tar
  161. X    uuencode cforms.tar.Z < cforms.tar.Z > cforms.uu
  162. X    rm cforms.tar.Z
  163. END_OF_FILE
  164. if test 1461 -ne `wc -c <'Makefile'`; then
  165.     echo shar: \"'Makefile'\" unpacked with wrong size!
  166. fi
  167. # end of 'Makefile'
  168. fi
  169. if test -f 'README' -a "${1}" != "-c" ; then 
  170.   echo shar: Will not clobber existing file \"'README'\"
  171. else
  172. echo shar: Extracting \"'README'\" \(1554 characters\)
  173. sed "s/^X//" >'README' <<'END_OF_FILE'
  174. X    CForms Vers 1.0 By Lars Berntzon, E-Mail: lab@cgl.se
  175. X    ----------------------------------------------------
  176. X
  177. X    CForms is a formular manager for building applications to be used
  178. X    for many types of terminals though it uses the {\em curses} library.
  179. X    CForms is built up by a language that consists of the objects: modules,
  180. X    pictures, fields, literals and events.
  181. X
  182. X    An application is built by one or more modules that contains one or
  183. X    more pictures that handles the various functions in the application.
  184. X    Each picture may contain any number of fields and text literal
  185. X    that describes the appearance of the picture.
  186. X
  187. X    Fields are defined by their name and may be specified with any type,
  188. X    size, special attributes and event handling functions.
  189. X
  190. X    CForms may be intermixed with C-code modules in any way.
  191. X    See the documentation in the doc:s directory on how to compile and
  192. X    use CForms.
  193. X
  194. X    Copyright stuff
  195. X    ---------------
  196. X    Permission is hereby granted to copy, reproduce, redistribute,
  197. X    or otherwise use this software as long as: there is no monetary
  198. X    profit gained specifically from the use or reproduction or this
  199. X    software, it is not sold, rented, traded or otherwise marketed,
  200. X    and this copyright notice is included prominently in any copy
  201. X    made.
  202. X
  203. X    The author make no claims as to the fitness or correctness of
  204. X    this software for any use whatsoever, and it is provided as is. 
  205. X    Any use of this software is at the user's own risk.
  206. X
  207. X    If you find any bugs though you can always mail a description to
  208. X    me on the address above and maybe i look into it.
  209. X
  210. X    Have fun.
  211. END_OF_FILE
  212. if test 1554 -ne `wc -c <'README'`; then
  213.     echo shar: \"'README'\" unpacked with wrong size!
  214. fi
  215. # end of 'README'
  216. fi
  217. if test ! -d 'bin' ; then
  218.     echo shar: Creating directory \"'bin'\"
  219.     mkdir 'bin'
  220. fi
  221. if test ! -d 'doc' ; then
  222.     echo shar: Creating directory \"'doc'\"
  223.     mkdir 'doc'
  224. fi
  225. if test -f 'doc/Makefile' -a "${1}" != "-c" ; then 
  226.   echo shar: Will not clobber existing file \"'doc/Makefile'\"
  227. else
  228. echo shar: Extracting \"'doc/Makefile'\" \(306 characters\)
  229. sed "s/^X//" >'doc/Makefile' <<'END_OF_FILE'
  230. X#
  231. X#        M A K E F I L E
  232. X#        ---------------
  233. X#
  234. X# Description:
  235. X#    Generates documentation
  236. X#
  237. X# $Log:    Makefile,v $
  238. X# Revision 1.1  92/01/19  12:41:04  lasse
  239. X# Initial revision
  240. X# 
  241. X# 
  242. X#
  243. XLATEX = latex
  244. Xdoc:
  245. X    $(LATEX) cforms.tex
  246. X    $(LATEX) cforms.tex
  247. X
  248. Xinstall:
  249. X
  250. Xclean:
  251. X    -rm -f cforms.toc cforms.log cforms.aux cforms.dvi
  252. END_OF_FILE
  253. if test 306 -ne `wc -c <'doc/Makefile'`; then
  254.     echo shar: \"'doc/Makefile'\" unpacked with wrong size!
  255. fi
  256. # end of 'doc/Makefile'
  257. fi
  258. if test ! -d 'example' ; then
  259.     echo shar: Creating directory \"'example'\"
  260.     mkdir 'example'
  261. fi
  262. if test -f 'example/Makefile' -a "${1}" != "-c" ; then 
  263.   echo shar: Will not clobber existing file \"'example/Makefile'\"
  264. else
  265. echo shar: Extracting \"'example/Makefile'\" \(589 characters\)
  266. sed "s/^X//" >'example/Makefile' <<'END_OF_FILE'
  267. X#
  268. X#        M A K E F I L E
  269. X#        ---------------
  270. X#
  271. X# Description:
  272. X#    Compiles and links CForms example
  273. X#
  274. X# $Log:    Makefile,v $
  275. X# Revision 1.2  92/01/19  13:21:05  lasse
  276. X# better clean
  277. X# 
  278. X# Revision 1.1  92/01/19  12:48:47  lasse
  279. X# Initial revision
  280. X# 
  281. X# 
  282. X#
  283. X
  284. X# 
  285. X# Installation places.
  286. X#
  287. X
  288. XCOMP  = ../bin/cfc
  289. XOS    = SYSV
  290. X
  291. XINCLUDE  = ../src
  292. XLIBDIR   = ../lib
  293. XLIBS     =  -lcforms -lcurses
  294. XOFILES   = cforms.o
  295. X
  296. XCFLAGS = -g -DSYS_$(OS) -I$(INCLUDE)
  297. X
  298. Xcforms : $(OFILES)
  299. X    $(CC) -o cforms $(OFILES) -L$(LIBDIR) $(LIBS)
  300. X
  301. Xinstall:
  302. X
  303. Xclean:
  304. X    rm -f cforms.o cforms cforms.c
  305. X    
  306. Xcforms.c : test.frm
  307. X    $(COMP) test.frm
  308. END_OF_FILE
  309. if test 589 -ne `wc -c <'example/Makefile'`; then
  310.     echo shar: \"'example/Makefile'\" unpacked with wrong size!
  311. fi
  312. # end of 'example/Makefile'
  313. fi
  314. if test -f 'example/test.frm' -a "${1}" != "-c" ; then 
  315.   echo shar: Will not clobber existing file \"'example/test.frm'\"
  316. else
  317. echo shar: Extracting \"'example/test.frm'\" \(4560 characters\)
  318. sed "s/^X//" >'example/test.frm' <<'END_OF_FILE'
  319. X/*
  320. X * Test application for CForms.
  321. X * $Log:    test.frm,v $
  322. XRevision 1.1  92/01/19  12:42:55  lasse
  323. XInitial revision
  324. X
  325. X */
  326. X
  327. XCCode {
  328. X    #include <stdio.h>
  329. X    main()
  330. X    {
  331. X        if (cforms_init() != OK) {
  332. X            fprintf(stderr, "Failed to start cforms\n");
  333. X            exit(1);
  334. X        }
  335. X
  336. X        if (pic_call(picture("main"), NULL) != OK) {
  337. X            fprintf(stderr, "No main picture\n");
  338. X        }
  339. X
  340. X        cforms_end();
  341. X    }
  342. X}
  343. X
  344. XViewport view {
  345. X    Pos 0,0;
  346. X    Size 80, 24;
  347. X}
  348. X
  349. XEvent Key DOWN  { fld_move(fld_down(current.field));  }
  350. XEvent Key UP    { fld_move(fld_up(current.field));    }
  351. XEvent Key CR    { fld_move(fld_next(current.field)); }
  352. XEvent Key TAB   { fld_move(fld_next(current.field)); }
  353. XEvent Key HELP  { message("You're using CForms"); }
  354. XEvent Key F8    { pic_leave(); }
  355. X
  356. XPicture Main Viewport View {
  357. X    Event Entry     { fld_set(current.field, "X"); }
  358. X    Event Exit      { fld_set(current.field, " "); }
  359. X    Event Key LEFT  { fld_move(fld_left(current.field));  }
  360. X    Event Key RIGHT { fld_move(fld_right(current.field)); }
  361. X    Event Key F8 Forget;
  362. X
  363. X    Event Key CR {
  364. X    if (!picture(current.field->name)) {
  365. X        message("Choise not available");
  366. X    }
  367. X    else pic_call(picture(current.field->name), NULL);
  368. X    }
  369. X
  370. X    Literal 25, 1, "M a i n   M e n u";    
  371. X    Literal 25, 2, "-----------------";    
  372. X
  373. X    Field List { Pos 10, 10; Type Char(1); Protected;
  374. X    LValue "[";  RValue "] Adress book"; }
  375. X
  376. X    Field Play    { Pos +0, +2; Type Char(1); Protected;
  377. X    LValue "[";  RValue "] Play Game"; }
  378. X
  379. X    Field Status  { Pos +0, +2; Type Char(1); Protected;
  380. X    LValue "[";  RValue "] Status Report"; }
  381. X
  382. X
  383. X    Field Reg     { Pos 40, 10; Type Char(1); Protected;
  384. X    LValue "[";  RValue "] Registration"; }
  385. X
  386. X
  387. X    Field Exit    {
  388. X    Pos 10, 20; Type Char(1); Protected;  LValue "["; RValue "] Exit";
  389. X    Event Key CR {
  390. X        pic_leave();
  391. X    }
  392. X    }
  393. X}
  394. X
  395. Xccode {
  396. X   int cur_row = 0;
  397. X}
  398. X
  399. XPicture Welcome Viewport View {
  400. X
  401. X    Event Draw {
  402. X    fld_set(field("name"), fld_get(field("list:name%d", cur_row)));
  403. X    fld_set(field("adress"), fld_get(field("list:adress%d", cur_row)));
  404. X    }
  405. X
  406. X    Event Key F8 { pic_leave(); message("Canceled"); }
  407. X
  408. X    Event Key F1 { 
  409. X    fld_set(field("list:name%d", cur_row), fld_get(field("name")));
  410. X    fld_set(field("list:adress%d", cur_row), fld_get(field("adress")));
  411. X    message("Inserted");
  412. X    pic_leave();
  413. X    }
  414. X
  415. X    Literal 25, 1,  "Person registration";
  416. X    Literal +0, +1, "-------------------";
  417. X
  418. X    Field name {
  419. X    Pos 20, 5;
  420. X    Type Char(20);
  421. X    LValue "Name: ";
  422. X    Uppercase;
  423. X    }
  424. X
  425. X    Field adress {
  426. X    Pos 20, 7;
  427. X    Type Char(20);
  428. X    LValue "Adress: ";
  429. X    Uppercase;
  430. X    }
  431. X
  432. X    Literal +0, +5, "(F1 - Update)    (F8 - Leave)";
  433. X}
  434. X
  435. XPicture List Viewport View
  436. X{
  437. X    Literal 25, 1,  "List of persons";
  438. X    Literal +0, +1, "---------------";
  439. X
  440. X    Event Key CR { pic_call(picture("welcome"), NULL); }
  441. X
  442. X    Event Key DOWN {
  443. X    if (cur_row < 9 && !fld_isempty(current.field)) {
  444. X         fld_move(field("Name%d", ++cur_row));
  445. X    }
  446. X    }
  447. X    Event Key UP   { if (cur_row > 0) fld_move(field("Name%d", --cur_row)); }
  448. X    Event Key Left { return; }
  449. X    Event Key Right { return; }
  450. X
  451. X    Field Name0   { Pos 10, 5;   Type Char(20); LValue "["; Protected; }
  452. X    Field Adress0 { Pos +20, +0; Type Char(20); RValue "]"; Protected; }
  453. X    Field Name1   { Pos -20, +1; Type Char(20); LValue "["; Protected; }
  454. X    Field Adress1 { Pos +20, +0; Type Char(20); RValue "]"; Protected; }
  455. X    Field Name2   { Pos -20, +1; Type Char(20); LValue "["; Protected; }
  456. X    Field Adress2 { Pos +20, +0; Type Char(20); RValue "]"; Protected; }
  457. X    Field Name3   { Pos -20, +1; Type Char(20); LValue "["; Protected; }
  458. X    Field Adress3 { Pos +20, +0; Type Char(20); RValue "]"; Protected; }
  459. X    Field Name4   { Pos -20, +1; Type Char(20); LValue "["; Protected; }
  460. X    Field Adress4 { Pos +20, +0; Type Char(20); RValue "]"; Protected; }
  461. X    Field Name5   { Pos -20, +1; Type Char(20); LValue "["; Protected; }
  462. X    Field Adress5 { Pos +20, +0; Type Char(20); RValue "]"; Protected; }
  463. X    Field Name6   { Pos -20, +1; Type Char(20); LValue "["; Protected; }
  464. X    Field Adress6 { Pos +20, +0; Type Char(20); RValue "]"; Protected; }
  465. X    Field Name7   { Pos -20, +1; Type Char(20); LValue "["; Protected; }
  466. X    Field Adress7 { Pos +20, +0; Type Char(20); RValue "]"; Protected; }
  467. X    Field Name8   { Pos -20, +1; Type Char(20); LValue "["; Protected; }
  468. X    Field Adress8 { Pos +20, +0; Type Char(20); RValue "]"; Protected; }
  469. X    Field Name9   { Pos -20, +1; Type Char(20); LValue "["; Protected; }
  470. X    Field Adress9 { Pos +20, +0; Type Char(20); RValue "]"; Protected; }
  471. X
  472. X    Literal -20, +5, "(F8 - Leave)";
  473. X}
  474. END_OF_FILE
  475. if test 4560 -ne `wc -c <'example/test.frm'`; then
  476.     echo shar: \"'example/test.frm'\" unpacked with wrong size!
  477. fi
  478. # end of 'example/test.frm'
  479. fi
  480. if test ! -d 'lib' ; then
  481.     echo shar: Creating directory \"'lib'\"
  482.     mkdir 'lib'
  483. fi
  484. if test -f 'patchlevel.h' -a "${1}" != "-c" ; then 
  485.   echo shar: Will not clobber existing file \"'patchlevel.h'\"
  486. else
  487. echo shar: Extracting \"'patchlevel.h'\" \(21 characters\)
  488. sed "s/^X//" >'patchlevel.h' <<'END_OF_FILE'
  489. X#define PATCHLEVEL 1
  490. END_OF_FILE
  491. if test 21 -ne `wc -c <'patchlevel.h'`; then
  492.     echo shar: \"'patchlevel.h'\" unpacked with wrong size!
  493. fi
  494. # end of 'patchlevel.h'
  495. fi
  496. if test ! -d 'src' ; then
  497.     echo shar: Creating directory \"'src'\"
  498.     mkdir 'src'
  499. fi
  500. if test -f 'src/Makefile' -a "${1}" != "-c" ; then 
  501.   echo shar: Will not clobber existing file \"'src/Makefile'\"
  502. else
  503. echo shar: Extracting \"'src/Makefile'\" \(1094 characters\)
  504. sed "s/^X//" >'src/Makefile' <<'END_OF_FILE'
  505. X#
  506. X#        M A K E F I L E
  507. X#        ---------------
  508. X#
  509. X# Description:
  510. X#    Compiles and links CForms
  511. X#
  512. X# $Log:    Makefile,v $
  513. X# Revision 1.12  92/01/19  13:18:47  lasse
  514. X# *** empty log message ***
  515. X# 
  516. X# 
  517. X#
  518. X
  519. X# 
  520. X# Installation places.
  521. X#
  522. XDEST        = ..
  523. X
  524. XDESTBIN     = $(DEST)/bin
  525. XDESTLIB     = $(DEST)/lib
  526. XDESTINCLUDE = $(DEST)/include
  527. X
  528. XOS          = SYSV
  529. XLIBS        = 
  530. XCFLAGS      = -g -DSYS_$(OS)
  531. X
  532. X# -----------------------------------------------
  533. X
  534. XFORMLIB = ../lib/libcforms.a
  535. XCFC     = ../bin/cfc
  536. XFORMHDR = cforms.h
  537. X
  538. XOFILES =    comp.o get_ccode.o get_event.o get_field.o get_literal.o \
  539. X        get_picture.o get_stmt.o get_viewport.o    output.o skip_stmt.o \
  540. X        token.o
  541. X
  542. XHFILES = $(FORMHDR) comp.h token.h config.h
  543. X
  544. X
  545. X
  546. Xall: cfc lib
  547. Xcfc: $(CFC)
  548. Xlib: $(FORMLIB)
  549. X
  550. X$(CFC): $(OFILES)
  551. X    $(CC) -o $(CFC) $(OFILES) $(LIBS)
  552. X
  553. Xinstall: all
  554. X    -rm -f $(DESTBIN)/cfc; cp $(CFC) $(DESTBIN)
  555. X    -rm -f $(DESTLIB)/$(FORMLIB); cp $(FORMLIB) $(DESTLIB)
  556. X    -rm -f $(DESTINCLUDE)/cforms.h; cp $(FORMHDR) $(DESTINCLUDE)
  557. X
  558. X$(FORMLIB): $(FORMLIB)(cflib.o)
  559. X$(FORMLIB)(cflib.o): $(HFILES)
  560. X
  561. Xclean:
  562. X    -rm -f $(OFILES)
  563. X
  564. X$(OFILES): $(HFILES)
  565. Xget_event.o: keys.h
  566. END_OF_FILE
  567. if test 1094 -ne `wc -c <'src/Makefile'`; then
  568.     echo shar: \"'src/Makefile'\" unpacked with wrong size!
  569. fi
  570. # end of 'src/Makefile'
  571. fi
  572. if test -f 'src/cforms.h' -a "${1}" != "-c" ; then 
  573.   echo shar: Will not clobber existing file \"'src/cforms.h'\"
  574. else
  575. echo shar: Extracting \"'src/cforms.h'\" \(2989 characters\)
  576. sed "s/^X//" >'src/cforms.h' <<'END_OF_FILE'
  577. X#ifndef _CFORMS_H
  578. X#define _CFORMS_H
  579. X
  580. X#ifndef OK
  581. X#define OK    0
  582. X#endif
  583. X
  584. X#ifndef FAIL
  585. X#define FAIL    -1
  586. X#endif
  587. X
  588. X#ifndef TRUE
  589. X#define TRUE 1
  590. X#endif
  591. X
  592. X#ifndef FALSE
  593. X#define FALSE 0
  594. X#endif
  595. X
  596. X#define EVENT_KEY    1
  597. X#define EVENT_REFRESH    2
  598. X#define EVENT_ENTRY    3
  599. X#define EVENT_EXIT    4
  600. X#define EVENT_DRAW    5
  601. X#define EVENT_PREVIOUS    6
  602. X#define EVENT_NEXT    7
  603. X
  604. X#define FLD_TYPE    0x000F
  605. X#define FLD_MODIFIER    0x0FF0
  606. X
  607. X#define FLD_RIGHT    0x0010
  608. X#define FLD_LEFT    0x0020
  609. X#define FLD_UPPERCASE    0x0040
  610. X#define FLD_PROTECTED    0x0080
  611. X
  612. X#define FLD_INT        0x0001
  613. X#define FLD_STR        0x0002
  614. X#define FLD_ALNUM    0x0003
  615. X
  616. Xstruct xy {
  617. X    int x, y;
  618. X};
  619. X
  620. X#ifndef _COMP_H
  621. Xstruct event {
  622. X    int type;
  623. X    int code;
  624. X    void (*func)();
  625. X};
  626. X
  627. Xstruct field {
  628. X    char *name;
  629. X    int type;
  630. X    int len;
  631. X    char *data;
  632. X    struct xy pos;
  633. X    char *lvalue;
  634. X    char *rvalue;
  635. X    struct event *event;
  636. X    int n_events;
  637. X    int flags;
  638. X    char modified;
  639. X    struct picture *picture;
  640. X};
  641. X
  642. Xstruct literal {
  643. X    struct xy pos;
  644. X    char *value;
  645. X    int display_flags;
  646. X};
  647. X
  648. Xstruct picture {
  649. X    char *name;
  650. X    struct field *field;
  651. X    int n_fields;
  652. X    struct literal *literal;
  653. X    int n_literals;
  654. X    struct event *event;
  655. X    int n_events;
  656. X    int x, y;
  657. X    int width, height;
  658. X};
  659. X
  660. Xstruct module {
  661. X    struct picture *picture;
  662. X    int n_pictures;
  663. X    struct event *event;
  664. X    int n_events;
  665. X};
  666. X
  667. Xextern struct current {
  668. X    struct picture *picture;
  669. X    struct field *field;
  670. X} current;
  671. X
  672. X/*
  673. X * Start/stop functions.
  674. X */
  675. Xextern int cforms_init(void);
  676. Xextern int cforms_end(void);
  677. X
  678. X/*
  679. X * Picture functions.
  680. X */
  681. Xextern struct picture *picture(char *fmt, ...);
  682. Xextern int             pic_call(struct picture *pic, char *fieldname);
  683. Xextern int             pic_clear(struct picture *pic);
  684. X
  685. X/* 
  686. X * Field functons.
  687. X */
  688. Xextern struct field *field(char *fmt, ...);
  689. Xextern struct field *fld_move(struct field *fld);
  690. Xextern struct field *fld_down(struct field *fld);
  691. Xextern struct field *fld_up(struct field *fld);
  692. Xextern struct field *fld_left(struct field *fld);
  693. Xextern struct field *fld_right(struct field *fld);
  694. Xextern struct field *fld_first(void);
  695. Xextern struct field *fld_last(void);
  696. Xextern struct field *fld_next(struct field *fld);
  697. Xextern struct field *fld_previous(struct field *fld);
  698. Xextern char         *fld_get(struct field *fld);
  699. Xextern int           fld_set(struct field *fld, char *value);
  700. Xextern int           fld_nset(struct field *fld, char *value, int n);
  701. Xextern int           fld_len(struct field *fld);
  702. Xextern int           fld_isempty(struct field *fld);
  703. Xextern int           fld_ismodified(struct field *fld);
  704. Xextern void          fld_touch(struct field *fld);
  705. X
  706. X/*
  707. X * General functions.
  708. X */
  709. Xextern                 get_fld(struct field *fld, int (*check)());
  710. Xextern int             generate_event(int ev_type, int ev_code);
  711. Xextern int             strequ(char *s1, char *s2);
  712. Xextern int             message(char *fmt, ...);
  713. Xextern int             message_nr(char *fmt, ...);
  714. X
  715. X
  716. Xextern struct module _module;
  717. X
  718. X#endif /* _COMP_H */
  719. X
  720. X#endif /* _CFORMS_H */
  721. X
  722. END_OF_FILE
  723. if test 2989 -ne `wc -c <'src/cforms.h'`; then
  724.     echo shar: \"'src/cforms.h'\" unpacked with wrong size!
  725. fi
  726. # end of 'src/cforms.h'
  727. fi
  728. if test -f 'src/comp.c' -a "${1}" != "-c" ; then 
  729.   echo shar: Will not clobber existing file \"'src/comp.c'\"
  730. else
  731. echo shar: Extracting \"'src/comp.c'\" \(5422 characters\)
  732. sed "s/^X//" >'src/comp.c' <<'END_OF_FILE'
  733. X/*******************************************************************************
  734. X *
  735. X *        C O M P . C
  736. X *        -----------
  737. X *
  738. X * Description:
  739. X *    Compile a FRM-file to C-code.
  740. X *
  741. X * Included functions:
  742. X *    main    - Main function
  743. X *
  744. X * Revision:
  745. X *    Ver    Date    By        Reason
  746. X *    ---    ----    --        ------
  747. X *    1.00    900619    Lars Berntzon    Created
  748. X *
  749. X ******************************************************************************/
  750. X
  751. X#include "config.h"
  752. X
  753. X#include <stdio.h>
  754. X#include <ctype.h>
  755. X#include <string.h>
  756. X#include <assert.h>
  757. X#include <signal.h>
  758. X#ifdef STDLIB_H
  759. X#include <stdlib.h>
  760. X#endif
  761. X#ifdef MALLOC_H
  762. X#include <malloc.h>
  763. X#endif
  764. X
  765. X#include "token.h"
  766. X#include "comp.h"
  767. X
  768. Xstruct list list;
  769. Xchar version[] = "1.1";
  770. Xint n_errors = 0;
  771. Xint n_warnings = 0;
  772. X
  773. Xextern int cleanup();
  774. X
  775. Xstatic int found_picture();
  776. Xstatic int found_event();
  777. Xstatic int found_viewport();
  778. Xstatic int found_ccode();
  779. X
  780. Xstatic int previous_x, previous_y;
  781. X
  782. Xstatic struct lookup_s lookup[] = {    /* Aviable commands at top level */
  783. X    "PICTURE",  found_picture,
  784. X    "EVENT",    found_event,
  785. X    "VIEWPORT", found_viewport,
  786. X    "CCODE",    found_ccode
  787. X};
  788. X
  789. X#ifdef VOID_MAIN
  790. X    void main(int argc, char *argv[])
  791. X#else
  792. X    main(int argc, char *argv[])
  793. X#endif
  794. X{
  795. X    char token [TOKENSIZE];
  796. X    int i;
  797. X    
  798. X    if (argc != 2) usage();
  799. X    
  800. X    if (OpenTok(argv[1]) == NULL) fatal("Failed to open file");
  801. X    
  802. X    signal(SIGINT, (SIGNAL_TYPE)cleanup);
  803. X    signal(SIGFPE, (SIGNAL_TYPE)cleanup);
  804. X    
  805. X    while(GetTokNC(token) != NULL) {
  806. X        for (i = 0; i < N_CMDS; i++) {
  807. X            if (strequ(token, lookup[i].cmd) == 0)
  808. X                break;
  809. X        }
  810. X        if (i < N_CMDS) {
  811. X            (*lookup[i].func)();
  812. X        }
  813. X        else {
  814. X            error("Unknown command");
  815. X        }
  816. X    }
  817. X    
  818. X    if (n_errors) {
  819. X        fprintf(stderr, "%d errors found.\n", n_errors);
  820. X#ifdef VOID_MAIN 
  821. X        return;
  822. X#else
  823. X        return 1;
  824. X#endif
  825. X    }
  826. X
  827. X    /*
  828. X     * Generate C-code.
  829. X     */
  830. X    output();
  831. X    
  832. X#ifdef VOID_MAIN 
  833. X    return;
  834. X#else
  835. X    return 0;
  836. X#endif
  837. X}
  838. X
  839. Xstatic int found_viewport()
  840. X{
  841. X    link((struct link **)&list.viewport, &get_viewport()->link, TYPE_VIEWPORT);
  842. X    return OK;
  843. X}
  844. Xstatic int found_picture()
  845. X{
  846. X    link((struct link **)&list.picture, &get_picture()->link, TYPE_PICTURE);
  847. X    return OK;
  848. X}
  849. Xstatic int found_event()
  850. X{
  851. X    link((struct link **)&list.event, &get_event()->link, TYPE_EVENT);
  852. X    return OK;
  853. X}
  854. Xstatic int found_ccode()
  855. X{
  856. X    link((struct link **)&list.ccode, &get_ccode()->link, TYPE_CCODE);
  857. X    return OK;
  858. X}
  859. X
  860. X/******************************************************************************/
  861. Xint strequ(char *s1, char *s2)
  862. X{
  863. X    while(*s1 && toupper(*s1) == toupper(*s2))
  864. X    s1++, s2++;
  865. X
  866. X    return toupper(*s1) - toupper(*s2);
  867. X}
  868. X
  869. Xvoid usage(void)
  870. X{
  871. X    fprintf(stderr, "Usage: comp <file>\n");
  872. X    exit(1);
  873. X}
  874. X
  875. Xvoid fatal(char *str)
  876. X{
  877. X    fprintf(stderr, "fatal: %s\n", str);
  878. X    exit(1);
  879. X}
  880. X
  881. Xvoid error(char *str)
  882. X{
  883. X    static int old_line;
  884. X    /*
  885. X     * Maximize to one error per line.
  886. X     */
  887. X    if (line > old_line) {
  888. X        n_errors++;
  889. X    old_line = line;
  890. X    fprintf(stderr, "error line %d: %s\n", line, str);
  891. X    }
  892. X}
  893. X
  894. Xvoid *_memalloc(char *file, int line, int size)
  895. X{
  896. X    void *p;
  897. X    if ((p = malloc(size)) == NULL) {
  898. X        fprintf(stderr, "*** %s %d out of memory ***\n", file, line);
  899. X        exit(1);
  900. X    }
  901. X    memset(p, 0, size);
  902. X
  903. X    return p;
  904. X}
  905. X
  906. Xvoid link(struct link **head, struct link *item, int type)
  907. X{
  908. X    if (item == NULL) return;
  909. X    
  910. X    item->type = type;
  911. X
  912. X    /*
  913. X     * Sort by name if aviable, otherwise last in list.
  914. X     */    
  915. X    if (item->name) {
  916. X        for(; *head != NULL; head = &(*head)->next) {
  917. X            if (strequ((*head)->name, item->name) > 0) break;
  918. X        }
  919. X    }
  920. X    else {
  921. X        for(; *head != NULL; head = & (*head)->next) 
  922. X            ;
  923. X    }
  924. X
  925. X    item->next = *head;
  926. X    *head = item;
  927. X}
  928. X
  929. Xstruct link *find_name(struct link *first, char *name)
  930. X{
  931. X    if (name == NULL) return NULL;
  932. X    
  933. X    for(; first != NULL; first = first->next) {
  934. X        if (first->name != NULL && strequ(name, first->name) == 0) break;
  935. X    }
  936. X
  937. X    return first;
  938. X}
  939. X
  940. Xvoid link_name(struct link *item, char *name)
  941. X{
  942. X    if (item == NULL || name == NULL) return;
  943. X
  944. X    item->name = memalloc(strlen(name) + 1);
  945. X    strcpy(item->name, name);
  946. X}
  947. X
  948. XGetPos(int *x, int *y)
  949. X{
  950. X    char token[TOKENSIZE];
  951. X    char sign = 0;
  952. X    
  953. X    if (GetTokNC(token) == NULL) return FAIL;
  954. X    
  955. X    if (token[0] == '+' || token[0] == '-') {
  956. X        sign = token[0];
  957. X        if (GetTokNC(token) == NULL) return FAIL;
  958. X    }
  959. X
  960. X    if (!isdigit(token[0])) return FAIL;
  961. X    
  962. X    *x = atoi(token);
  963. X    if (sign) *x = previous_x + (sign == '-' ? - *x : *x);
  964. X    sign = 0;
  965. X    
  966. X    if (GetTokNC(token) == NULL || strcmp(token, ",")) return FAIL;
  967. X    
  968. X    if (GetTokNC(token) == NULL) return FAIL;
  969. X    
  970. X    if (token[0] == '+' || token[0] == '-') {
  971. X        sign = token[0];
  972. X        if (GetTokNC(token) == NULL) return FAIL;
  973. X    }
  974. X    if (!isdigit(token[0])) return FAIL;
  975. X    
  976. X    *y = atoi(token);
  977. X    if (sign) *y = previous_y + (sign == '-' ? - *y : *y);
  978. X    sign = 0;
  979. X    
  980. X    previous_x = *x;
  981. X    previous_y = *y;
  982. X    
  983. X    return OK;
  984. X}
  985. X
  986. Xcleanup()
  987. X{
  988. X    struct viewport *vp;
  989. X    struct picture *pp;
  990. X    struct event *ep;
  991. X    struct ccode *cp;
  992. X    
  993. X    for(vp = list.viewport; vp != NULL; vp = unget_viewport(vp))
  994. X    ;
  995. X
  996. X    for(pp = list.picture; pp != NULL; pp = unget_picture(pp))
  997. X    ;
  998. X
  999. X    for(ep = list.event; ep != NULL; ep = unget_event(ep))
  1000. X    ;
  1001. X
  1002. X    for(cp = list.ccode; cp != NULL; cp = unget_ccode(cp))
  1003. X    ;
  1004. X    
  1005. X    exit(1);
  1006. X
  1007. X    return 0;
  1008. X}
  1009. END_OF_FILE
  1010. if test 5422 -ne `wc -c <'src/comp.c'`; then
  1011.     echo shar: \"'src/comp.c'\" unpacked with wrong size!
  1012. fi
  1013. # end of 'src/comp.c'
  1014. fi
  1015. if test -f 'src/comp.h' -a "${1}" != "-c" ; then 
  1016.   echo shar: Will not clobber existing file \"'src/comp.h'\"
  1017. else
  1018. echo shar: Extracting \"'src/comp.h'\" \(3258 characters\)
  1019. sed "s/^X//" >'src/comp.h' <<'END_OF_FILE'
  1020. X/*******************************************************************************
  1021. X *
  1022. X *        C O M P . H
  1023. X *        -----------
  1024. X *
  1025. X * Description:
  1026. X *    Headerfile for compiler.
  1027. X *
  1028. X * Revision:
  1029. X *    Ver    Date    By        Reason
  1030. X *    ---    ----    --        ------
  1031. X *    1.00    900619    Lars Berntzon    Created
  1032. X *
  1033. X ******************************************************************************/
  1034. X#ifndef _COMP_H
  1035. X#define _COMP_H
  1036. X
  1037. X#include "cforms.h"
  1038. X
  1039. X#define offsetof(type, item) (((int) &( ((type *)2)->item )) - 2)
  1040. X
  1041. X#define NEXT_VIEWPORT(ptr) ((struct viewport *)ptr->link.next)
  1042. X#define NEXT_PICTURE(ptr)  ((struct picture *)ptr->link.next)
  1043. X#define NEXT_FIELD(ptr)    ((struct field *)ptr->link.next)
  1044. X#define NEXT_EVENT(ptr)    ((struct event *)ptr->link.next)
  1045. X#define NEXT_LITERAL(ptr)  ((struct literal *)ptr->link.next)
  1046. X#define NEXT_CCODE(ptr)    ((struct ccode *)ptr->link.next)
  1047. X
  1048. X#define TYPE_VIEWPORT    1
  1049. X#define TYPE_PICTURE    2
  1050. X#define TYPE_FIELD    3
  1051. X#define TYPE_EVENT    4
  1052. X#define TYPE_LITERAL    5
  1053. X#define TYPE_CCODE    6
  1054. X
  1055. X#define memalloc(size)    _memalloc(__FILE__, __LINE__, (size))
  1056. X
  1057. X#define N_KEYS    (sizeof keys / sizeof keys[0])
  1058. X#define N_CMDS    (sizeof lookup / sizeof lookup[0])
  1059. X
  1060. X/* Common used struct for command parsing */
  1061. Xstatic struct lookup_s {
  1062. X    char *cmd;
  1063. X    int (*func)();
  1064. X};
  1065. X
  1066. Xstatic struct keys_s {
  1067. X    char *key;
  1068. X    char *code;
  1069. X};
  1070. X
  1071. Xstruct stmt {
  1072. X    struct stmt *next;
  1073. X    int line;
  1074. X    char txt[1];
  1075. X};
  1076. X
  1077. Xstruct link {
  1078. X    struct link *next;
  1079. X    int type;
  1080. X    char *name;
  1081. X};
  1082. X
  1083. Xstruct literal {
  1084. X    struct link link;
  1085. X    struct xy pos;
  1086. X    int display_flags;
  1087. X};
  1088. X
  1089. Xstruct viewport {
  1090. X    struct link link;
  1091. X    struct xy pos;
  1092. X    struct xy size;
  1093. X};
  1094. X
  1095. Xstruct ccode {
  1096. X    struct link link;
  1097. X    struct stmt *stmt;
  1098. X};
  1099. X
  1100. Xstruct event {
  1101. X    struct link link;
  1102. X    char *type;
  1103. X    char *code;
  1104. X    struct stmt *stmt;
  1105. X};
  1106. X
  1107. Xstruct field {
  1108. X    struct link link;
  1109. X    struct xy pos;
  1110. X    struct event *event;
  1111. X    char *lvalue;
  1112. X    char *rvalue;
  1113. X    char *type;
  1114. X    int len;
  1115. X    int flags;
  1116. X};
  1117. X
  1118. Xstruct picture {
  1119. X    struct link link;
  1120. X    struct viewport *viewport;
  1121. X    struct field *field;
  1122. X    struct literal *literal;
  1123. X    struct event *event;
  1124. X};
  1125. X
  1126. Xstruct list {
  1127. X    struct viewport *viewport;
  1128. X    struct picture *picture;
  1129. X    struct event *event;
  1130. X    struct ccode *ccode;
  1131. X};
  1132. X
  1133. Xextern int strequ(char *s1, char *s2);    /* Case insensitive strcmp    */
  1134. Xextern void fatal(char *str);        /* Give message and abort    */
  1135. Xextern void usage(void);        /* Give usage message and abort    */
  1136. Xextern void error(char *);        /* Give error message + lineno    */
  1137. X
  1138. X    /* malloc with memory check    */
  1139. Xextern void *_memalloc(char *file, int line, int size);
  1140. X
  1141. Xextern struct picture  *get_picture(), *unget_picture();
  1142. Xextern struct event    *get_event(), *unget_event();
  1143. Xextern struct viewport *get_viewport(), *unget_viewport();
  1144. Xextern struct field    *get_field(), *unget_field();
  1145. Xextern struct stmt     *get_stmt();
  1146. Xvoid   unget_stmt();
  1147. Xextern struct literal  *get_literal(), *unget_literal();
  1148. Xextern struct ccode    *get_ccode(), *unget_ccode();
  1149. Xextern void            link(struct link **head, struct link *item, int type);
  1150. Xextern void            link_name(struct link *item, char *name);
  1151. Xextern struct link    *find_name(struct link *first, char *name);
  1152. X
  1153. Xextern int GetPos(int *x, int *y);
  1154. Xextern struct list list;
  1155. Xextern char version[];
  1156. X
  1157. X#endif _/* COMP_H */
  1158. X
  1159. END_OF_FILE
  1160. if test 3258 -ne `wc -c <'src/comp.h'`; then
  1161.     echo shar: \"'src/comp.h'\" unpacked with wrong size!
  1162. fi
  1163. # end of 'src/comp.h'
  1164. fi
  1165. if test -f 'src/config.h' -a "${1}" != "-c" ; then 
  1166.   echo shar: Will not clobber existing file \"'src/config.h'\"
  1167. else
  1168. echo shar: Extracting \"'src/config.h'\" \(666 characters\)
  1169. sed "s/^X//" >'src/config.h' <<'END_OF_FILE'
  1170. X/******************************************************************************
  1171. X *
  1172. X *            C O N F I G . H
  1173. X *            ---------------
  1174. X *
  1175. X * Description:
  1176. X *    Configuration file for setting up switches depending
  1177. X *    of machine type.
  1178. X * 
  1179. X * Revision:
  1180. X *    Ver    Date    By        Reason
  1181. X *    ---    ----    --        ------
  1182. X *    1.00    900815    Lars Berntzon    Created
  1183. X *
  1184. X ****************************************************************************/
  1185. X#ifndef _CONFIG_H
  1186. X#define _CONFIG_H
  1187. X
  1188. X#ifdef SYS_AMIGA
  1189. X#define STDLIB_H
  1190. X#define VOID_MAIN
  1191. X#endif
  1192. X
  1193. X#ifdef SYS_SYSV
  1194. X#define SIGNAL_TYPE void(*)()
  1195. X#define TERMIOS
  1196. X#define MALLOC_H
  1197. X#endif
  1198. X
  1199. X#ifndef SIGNAL_TYPE
  1200. X#define SIGNAL_TYPE void(*)()
  1201. X#endif
  1202. X#endif /* _CONFIG_H */
  1203. END_OF_FILE
  1204. if test 666 -ne `wc -c <'src/config.h'`; then
  1205.     echo shar: \"'src/config.h'\" unpacked with wrong size!
  1206. fi
  1207. # end of 'src/config.h'
  1208. fi
  1209. if test -f 'src/get_ccode.c' -a "${1}" != "-c" ; then 
  1210.   echo shar: Will not clobber existing file \"'src/get_ccode.c'\"
  1211. else
  1212. echo shar: Extracting \"'src/get_ccode.c'\" \(1054 characters\)
  1213. sed "s/^X//" >'src/get_ccode.c' <<'END_OF_FILE'
  1214. X/*******************************************************************************
  1215. X *
  1216. X *        G E T _ C C O D E . C
  1217. X *        ---------------------
  1218. X *
  1219. X * Description:
  1220. X *    Compiles a C-code statement.
  1221. X *
  1222. X * Included functions:
  1223. X *    get_ccode    - Does the job
  1224. X *
  1225. X * Revision:
  1226. X *    Ver    Date    By        Reason
  1227. X *    ---    ----    --        ------
  1228. X *    1.00    90730    Lars Berntzon    Created
  1229. X *
  1230. X ******************************************************************************/
  1231. X
  1232. X#include <stdio.h>
  1233. X#include <ctype.h>
  1234. X#include <string.h>
  1235. X
  1236. X#include "token.h"
  1237. X#include "comp.h"
  1238. X
  1239. Xstruct ccode *get_ccode()
  1240. X{
  1241. X    struct ccode *cp = NULL;
  1242. X    struct stmt *stmt;
  1243. X
  1244. X    if ((stmt = get_stmt()) == NULL) {
  1245. X        error("expected C-code statements");
  1246. X        return NULL;
  1247. X    }
  1248. X    
  1249. X    cp = memalloc(sizeof *cp);
  1250. X    cp->stmt = stmt;
  1251. X    
  1252. X    return cp;
  1253. X}
  1254. X
  1255. Xstruct ccode *unget_ccode(struct ccode *cp)
  1256. X{
  1257. X    struct ccode *next;
  1258. X    
  1259. X    if (cp == NULL) return NULL;
  1260. X    
  1261. X    next = NEXT_CCODE(cp);
  1262. X    if (cp->stmt) unget_stmt(cp->stmt);
  1263. X    if (cp->link.name) free(cp->link.name);
  1264. X    free(cp);
  1265. X    
  1266. X    return next;
  1267. X}
  1268. X    
  1269. END_OF_FILE
  1270. if test 1054 -ne `wc -c <'src/get_ccode.c'`; then
  1271.     echo shar: \"'src/get_ccode.c'\" unpacked with wrong size!
  1272. fi
  1273. # end of 'src/get_ccode.c'
  1274. fi
  1275. if test -f 'src/get_event.c' -a "${1}" != "-c" ; then 
  1276.   echo shar: Will not clobber existing file \"'src/get_event.c'\"
  1277. else
  1278. echo shar: Extracting \"'src/get_event.c'\" \(4291 characters\)
  1279. sed "s/^X//" >'src/get_event.c' <<'END_OF_FILE'
  1280. X/*******************************************************************************
  1281. X *
  1282. X *        G E T _ E V E N T . C
  1283. X *        ---------------------
  1284. X *
  1285. X * Description:
  1286. X *    Compiles an event statement.
  1287. X *
  1288. X * Included functions:
  1289. X *    get_event    - Does the job
  1290. X *
  1291. X * Revision:
  1292. X *    Ver    Date    By        Reason
  1293. X *    ---    ----    --        ------
  1294. X *    1.00    900625    Lars Berntzon    Created
  1295. X *
  1296. X ******************************************************************************/
  1297. X
  1298. X#include <stdio.h>
  1299. X#include <ctype.h>
  1300. X#include <string.h>
  1301. X#include <assert.h>
  1302. X
  1303. X#include "token.h"
  1304. X#include "comp.h"
  1305. X
  1306. Xstatic int get_event_stmt(struct stmt **stmt);
  1307. X
  1308. Xstatic int found_key();
  1309. Xstatic int found_refresh();
  1310. Xstatic int found_draw();
  1311. Xstatic int found_entry();
  1312. Xstatic int found_exit();
  1313. Xstatic int found_next();
  1314. Xstatic int found_previous();
  1315. X
  1316. Xstatic struct keys_s keys[] = {
  1317. X#include "keys.h"
  1318. X};
  1319. X
  1320. Xstatic struct lookup_s lookup[] = {
  1321. X    "KEY",      found_key,
  1322. X    "REFRESH",  found_refresh,
  1323. X    "DRAW",     found_draw,
  1324. X    "ENTRY",    found_entry,
  1325. X    "EXIT",     found_exit,
  1326. X    "NEXT",     found_next,
  1327. X    "PREVIOUS", found_previous
  1328. X};
  1329. X
  1330. Xstruct event *get_event()
  1331. X{
  1332. X    char token[TOKENSIZE];
  1333. X    struct event *ep = NULL;
  1334. X    int i;
  1335. X
  1336. X    if (GetTokNC(token) == NULL) {
  1337. X        error("expected type of event");
  1338. X        return NULL;
  1339. X    }
  1340. X    
  1341. X    for (i = 0; i < N_CMDS; i++) {
  1342. X        if (strequ(lookup[i].cmd, token) == 0) break;
  1343. X    }
  1344. X    
  1345. X    if (i >= N_CMDS) {
  1346. X        error("illegal type of event");
  1347. X        return NULL;
  1348. X    }
  1349. X    
  1350. X    ep = memalloc(sizeof *ep);
  1351. X    
  1352. X    if ((*lookup[i].func)(ep) != OK) {
  1353. X        unget_event(ep);
  1354. X        return NULL;
  1355. X    }
  1356. X    
  1357. X    return ep;
  1358. X}
  1359. X
  1360. Xstruct event *unget_event(struct event *ep)
  1361. X{
  1362. X    struct event *next;
  1363. X    
  1364. X    if (ep == NULL) return NULL;
  1365. X
  1366. X    next = (struct event *)ep->link.next;
  1367. X    
  1368. X    if (ep->link.name) free(ep->link.name);
  1369. X    free(ep);
  1370. X
  1371. X    return next;
  1372. X}
  1373. X
  1374. Xstatic int found_key(ep)
  1375. X    struct event *ep;
  1376. X{
  1377. X    char token[TOKENSIZE];
  1378. X    int i;
  1379. X    
  1380. X    if (GetTokNC(token) == NULL) {
  1381. X        error("expected name of key for event");
  1382. X        return FAIL;
  1383. X    }
  1384. X    
  1385. X    for(i = 0; i < N_KEYS; i++) {
  1386. X        if(strequ(token, keys[i].key) == 0) break;
  1387. X    }
  1388. X
  1389. X    if (i >= N_KEYS) {
  1390. X        error("unknown key");
  1391. X        return FAIL;
  1392. X    }
  1393. X    
  1394. X    if (ep->link.name == NULL) {
  1395. X        sprintf(token, "key_%s", keys[i].key);
  1396. X        link_name(&ep->link, token);
  1397. X    }
  1398. X    
  1399. X    ep->type = "EVENT_KEY";
  1400. X    ep->code = keys[i].code;
  1401. X    if (get_event_stmt(&ep->stmt) != OK) return FAIL;
  1402. X    
  1403. X    return OK;
  1404. X}
  1405. X
  1406. Xstatic found_refresh(ep)
  1407. X    struct event *ep;
  1408. X{
  1409. X    link_name(&ep->link, "REFRESH");
  1410. X    ep->type = "EVENT_REFRESH";
  1411. X    ep->code = "0";
  1412. X    if (get_event_stmt(&ep->stmt) != OK) return FAIL;
  1413. X    return OK;
  1414. X}
  1415. X
  1416. Xstatic found_draw(ep)
  1417. X    struct event *ep;
  1418. X{
  1419. X    link_name(&ep->link, "DRAW");
  1420. X    ep->type = "EVENT_DRAW";
  1421. X    ep->code = "0";
  1422. X    if (get_event_stmt(&ep->stmt) != OK) return FAIL;
  1423. X    return OK;
  1424. X}
  1425. X
  1426. Xstatic found_next(ep)
  1427. X    struct event *ep;
  1428. X{
  1429. X    link_name(&ep->link, "NEXT");
  1430. X    ep->type = "EVENT_NEXT";
  1431. X    ep->code = "0";
  1432. X    if (get_event_stmt(&ep->stmt) != OK) return FAIL;
  1433. X    return OK;
  1434. X}
  1435. X
  1436. Xstatic found_previous(ep)
  1437. X    struct event *ep;
  1438. X{
  1439. X    link_name(&ep->link, "PREVIOUS");
  1440. X    ep->type = "EVENT_PREVIOUS";
  1441. X    ep->code = "0";
  1442. X    if (get_event_stmt(&ep->stmt) != OK) return FAIL;
  1443. X    return OK;
  1444. X}
  1445. X
  1446. Xstatic found_entry(ep)
  1447. X    struct event *ep;
  1448. X{
  1449. X    link_name(&ep->link, "ENTRY");
  1450. X    ep->type = "EVENT_ENTRY";
  1451. X    ep->code = "0";
  1452. X    if (get_event_stmt(&ep->stmt) != OK) return FAIL;
  1453. X    return OK;
  1454. X}
  1455. X
  1456. Xstatic found_exit(ep)
  1457. X    struct event *ep;
  1458. X{
  1459. X    link_name(&ep->link, "EXIT");
  1460. X    ep->type = "EVENT_EXIT";
  1461. X    ep->code = "0";
  1462. X    if (get_event_stmt(&ep->stmt) != OK) return FAIL;
  1463. X    return OK;
  1464. X}
  1465. X
  1466. Xstatic int get_event_stmt(struct stmt **stmt)
  1467. X{
  1468. X    char token[TOKENSIZE];
  1469. X    
  1470. X    assert(stmt);
  1471. X    
  1472. X    if (GetTokNC(token) == NULL) {
  1473. X        error("expected either '{' or 'forget'");
  1474. X        return FAIL;
  1475. X    }
  1476. X    
  1477. X    if (strcmp(token, "{") == 0) {
  1478. X        UnGetTok("{");
  1479. X        if (*stmt = get_stmt()) return OK;
  1480. X        return FAIL;
  1481. X    }
  1482. X    else if (strequ(token, "forget") == 0) {
  1483. X        *stmt = NULL;
  1484. X        if (GetTokNC(token) == NULL ||strequ(token, ";")) {
  1485. X            error("expected ';'");
  1486. X            return FAIL;
  1487. X        }
  1488. X        return OK;
  1489. X    }
  1490. X    error("expected either '{' or 'forget'");
  1491. X    return FAIL;
  1492. X}
  1493. X
  1494. END_OF_FILE
  1495. if test 4291 -ne `wc -c <'src/get_event.c'`; then
  1496.     echo shar: \"'src/get_event.c'\" unpacked with wrong size!
  1497. fi
  1498. # end of 'src/get_event.c'
  1499. fi
  1500. if test -f 'src/get_literal.c' -a "${1}" != "-c" ; then 
  1501.   echo shar: Will not clobber existing file \"'src/get_literal.c'\"
  1502. else
  1503. echo shar: Extracting \"'src/get_literal.c'\" \(2287 characters\)
  1504. sed "s/^X//" >'src/get_literal.c' <<'END_OF_FILE'
  1505. X/*******************************************************************************
  1506. X *
  1507. X *        G E T _ L I T E R A L . C
  1508. X *        -------------------------
  1509. X *
  1510. X * Description:
  1511. X *    Compiles a literal statemnent.
  1512. X *
  1513. X * Included functions:
  1514. X *    get_literal    - Does the job
  1515. X *
  1516. X * Revision:
  1517. X *    Ver    Date    By        Reason
  1518. X *    ---    ----    --        ------
  1519. X *    1.00    900627    Lars Berntzon    Created
  1520. X *
  1521. X ******************************************************************************/
  1522. X
  1523. X#include <stdio.h>
  1524. X#include <ctype.h>
  1525. X#include <string.h>
  1526. X
  1527. X#include "token.h"
  1528. X#include "comp.h"
  1529. X
  1530. X#define isnormal(ch) (isalnum(ch) || (ch) == '_')
  1531. X
  1532. Xstatic int found_display();
  1533. X
  1534. Xstatic struct lookup_s lookup[] = {
  1535. X    "DISPLAY",    found_display
  1536. X};
  1537. X
  1538. Xstruct literal *get_literal()
  1539. X{
  1540. X    char token[TOKENSIZE];
  1541. X    struct literal *lp = NULL;
  1542. X    int i;
  1543. X    int x, y;
  1544. X    
  1545. X    if (GetPos(&x, &y) != OK) {
  1546. X        error("expected a coordinate");
  1547. X        return NULL;
  1548. X    }
  1549. X    
  1550. X    if (GetTokNC(token) == NULL || strcmp(token, ",")) {
  1551. X        error("expected a ',' after row");
  1552. X        return NULL;
  1553. X    }
  1554. X    
  1555. X    if (GetTokNC(token) == NULL || token[0] != '"') {
  1556. X        error("expected literal text");
  1557. X        return NULL;
  1558. X    }
  1559. X    
  1560. X    token[strlen(token) - 1] = 0;
  1561. X    
  1562. X    lp = memalloc(sizeof *lp);
  1563. X    link_name(&lp->link, token + 1);
  1564. X    
  1565. X    if(GetTokNC(token) == NULL ||
  1566. X       (strcmp(token, "{") != 0 &&
  1567. X        strcmp(token, ";") != 0) ) {
  1568. X        error("expected '{' ot ';'");
  1569. X        unget_literal(lp);
  1570. X        return NULL;
  1571. X    }
  1572. X    
  1573. X    lp->pos.x = x;
  1574. X    lp->pos.y = y;
  1575. X    
  1576. X    if(strcmp(token, ";") == 0) {
  1577. X        return lp;
  1578. X    }
  1579. X    
  1580. X    while(GetTokNC(token) != NULL) {
  1581. X        if (strcmp(token, "}") == 0) break;
  1582. X        
  1583. X    for(i = 0; i < N_CMDS; i++) {
  1584. X        if (strequ(token, lookup[i].cmd) == 0) break;
  1585. X    }
  1586. X    if (i < N_CMDS) {
  1587. X        if ((*lookup[i].func)(lp) != OK) {
  1588. X        unget_literal(lp);
  1589. X        return NULL;
  1590. X        }
  1591. X    }
  1592. X    else {
  1593. X        fprintf(stderr, "line %d: unknown token '%s' for literal\n",
  1594. X            line, token);
  1595. X    }
  1596. X    }
  1597. X
  1598. X    return lp;
  1599. X}
  1600. X
  1601. Xstruct literal *unget_literal(struct literal *lp)
  1602. X{
  1603. X    struct literal *next;
  1604. X    
  1605. X    if (lp == NULL) return NULL;
  1606. X    
  1607. X    next = (struct literal *)lp->link.next;
  1608. X    
  1609. X    if (lp->link.name) free(lp->link.name);
  1610. X    free(lp);
  1611. X
  1612. X    return next;
  1613. X}
  1614. X
  1615. Xstatic int found_display(lp)
  1616. X    struct literal *lp;
  1617. X{
  1618. X
  1619. X    return OK;
  1620. X}
  1621. END_OF_FILE
  1622. if test 2287 -ne `wc -c <'src/get_literal.c'`; then
  1623.     echo shar: \"'src/get_literal.c'\" unpacked with wrong size!
  1624. fi
  1625. # end of 'src/get_literal.c'
  1626. fi
  1627. if test -f 'src/get_picture.c' -a "${1}" != "-c" ; then 
  1628.   echo shar: Will not clobber existing file \"'src/get_picture.c'\"
  1629. else
  1630. echo shar: Extracting \"'src/get_picture.c'\" \(3364 characters\)
  1631. sed "s/^X//" >'src/get_picture.c' <<'END_OF_FILE'
  1632. X/*******************************************************************************
  1633. X *
  1634. X *        G E T _ P I C T U R E . C
  1635. X *        -------------------------
  1636. X *
  1637. X * Description:
  1638. X *    Compiles a picture statement.
  1639. X *
  1640. X * Included functions:
  1641. X *    get_picture    - Does the job
  1642. X *
  1643. X * Revision:
  1644. X *    Ver    Date    By        Reason
  1645. X *    ---    ----    --        ------
  1646. X *    1.00    900621    Lars Berntzon    Created
  1647. X *
  1648. X ******************************************************************************/
  1649. X
  1650. X#include <stdio.h>
  1651. X#include <ctype.h>
  1652. X#include <string.h>
  1653. X
  1654. X#include "token.h"
  1655. X#include "comp.h"
  1656. X
  1657. X#define isnormal(ch) (isalnum(ch) || (ch) == '_')
  1658. X
  1659. Xstatic int found_field();
  1660. Xstatic int found_event();
  1661. Xstatic int found_literal();
  1662. X
  1663. Xstatic struct lookup_s lookup[] = {
  1664. X    "FIELD",   found_field,
  1665. X    "LITERAL", found_literal,
  1666. X    "EVENT",   found_event
  1667. X};
  1668. X
  1669. Xstruct picture *get_picture()
  1670. X{
  1671. X    char token[TOKENSIZE];
  1672. X    struct link *lp;
  1673. X    struct picture *pp = NULL;
  1674. X    int i;
  1675. X    
  1676. X    if(GetTokNC(token) == NULL || !isnormal(token[0])) {
  1677. X        error("expected nam of picture");
  1678. X        return NULL;
  1679. X    }
  1680. X    
  1681. X    pp = memalloc(sizeof *pp);
  1682. X    link_name(&pp->link, token);
  1683. X    
  1684. X    /* Check that viewport is specified */
  1685. X    if (GetTokNC(token) == NULL || strequ(token, "viewport")) {
  1686. X        error("expected viewport");
  1687. X        unget_picture(pp);
  1688. X        return NULL;
  1689. X    }
  1690. X    
  1691. X    if (GetTokNC(token) == NULL || !isnormal(token[0])) {
  1692. X        error("expected name of viewport");
  1693. X        unget_picture(pp);
  1694. X        return NULL;
  1695. X    }
  1696. X    
  1697. X    if ((lp = find_name((struct link *)list.viewport, token)) == NULL) {
  1698. X        error("unknown viewport");
  1699. X        unget_picture(pp);
  1700. X        return NULL;
  1701. X    }
  1702. X    
  1703. X    pp->viewport = (struct viewport *)lp;
  1704. X    
  1705. X    if (GetTokNC(token) == NULL || strcmp(token, "{")) {
  1706. X        error("expected '{'");
  1707. X        unget_picture(pp);
  1708. X        return NULL;
  1709. X    }
  1710. X    
  1711. X    while(GetTokNC(token) != NULL) {
  1712. X        if (strcmp(token, "}") == 0) break;
  1713. X        
  1714. X    for(i = 0; i < N_CMDS; i++) {
  1715. X        if (strequ(token, lookup[i].cmd) == 0) break;
  1716. X    }
  1717. X    if (i < N_CMDS) {
  1718. X        if ((*lookup[i].func)(pp) != OK) {
  1719. X            unget_picture(pp);
  1720. X            return NULL;
  1721. X        }
  1722. X    }
  1723. X    else {
  1724. X        fprintf(stderr, "line %d: unknown token '%s' for picture\n", 
  1725. X                line, token);
  1726. X    }
  1727. X    }
  1728. X    return pp;
  1729. X}
  1730. X
  1731. Xstruct picture *unget_picture(struct picture *pp)
  1732. X{
  1733. X    struct picture *next;
  1734. X    struct field *fp;
  1735. X    struct literal *lp;
  1736. X    struct event *ep;
  1737. X    
  1738. X    if (pp == NULL) return NULL;
  1739. X    
  1740. X    next = (struct picture *)pp->link.next;
  1741. X    
  1742. X    for(fp = pp->field; fp != NULL; fp = unget_field(fp))
  1743. X    ;
  1744. X    
  1745. X    for(lp = pp->literal; lp != NULL; lp = unget_literal(lp))
  1746. X    ;
  1747. X
  1748. X    for(ep = pp->event; ep != NULL; ep = unget_event(ep))
  1749. X    ;
  1750. X
  1751. X    if (pp->link.name) free(pp->link.name);
  1752. X
  1753. X    free(pp);
  1754. X
  1755. X    return next;
  1756. X}
  1757. X
  1758. Xstatic int found_field(pp)
  1759. X    struct picture *pp;
  1760. X{
  1761. X    struct field *fp;
  1762. X    
  1763. X    if ((fp = get_field()) == NULL) return FAIL;
  1764. X
  1765. X    link((struct link **)&pp->field, &fp->link, TYPE_FIELD);
  1766. X
  1767. X    return OK;
  1768. X}
  1769. X
  1770. Xstatic int found_literal(pp)
  1771. X    struct picture *pp;
  1772. X{
  1773. X    struct literal *lp;
  1774. X    
  1775. X    if ((lp = get_literal()) == NULL) return FAIL;
  1776. X    
  1777. X    link((struct link **)&pp->literal, &lp->link, TYPE_LITERAL);
  1778. X
  1779. X    return OK;
  1780. X}
  1781. X
  1782. Xstatic int found_event(pp)
  1783. X    struct picture *pp;
  1784. X{
  1785. X    struct event *ep;
  1786. X    
  1787. X    if ((ep = get_event()) == NULL) return FAIL;
  1788. X    
  1789. X    link((struct link **)&pp->event, &ep->link, TYPE_EVENT);
  1790. X
  1791. X    return OK;
  1792. X}
  1793. X
  1794. END_OF_FILE
  1795. if test 3364 -ne `wc -c <'src/get_picture.c'`; then
  1796.     echo shar: \"'src/get_picture.c'\" unpacked with wrong size!
  1797. fi
  1798. # end of 'src/get_picture.c'
  1799. fi
  1800. if test -f 'src/get_stmt.c' -a "${1}" != "-c" ; then 
  1801.   echo shar: Will not clobber existing file \"'src/get_stmt.c'\"
  1802. else
  1803. echo shar: Extracting \"'src/get_stmt.c'\" \(2158 characters\)
  1804. sed "s/^X//" >'src/get_stmt.c' <<'END_OF_FILE'
  1805. X/*******************************************************************************
  1806. X *
  1807. X *        G E T _ S T M T . C
  1808. X *        -------------------
  1809. X *
  1810. X * Description:
  1811. X *    Compiles a C-statement block into an allocated memory chain.
  1812. X *
  1813. X * Included functions:
  1814. X *    get_stmt    - Does the job
  1815. X *
  1816. X * Revision:
  1817. X *    Ver    Date    By        Reason
  1818. X *    ---    ----    --        ------
  1819. X *    1.00    900625    Lars Berntzon    Created
  1820. X *
  1821. X ******************************************************************************/
  1822. X
  1823. X#include "config.h"
  1824. X
  1825. X#include <stdio.h>
  1826. X#include <ctype.h>
  1827. X#include <string.h>
  1828. X
  1829. X#ifdef STDLIB_H
  1830. X#include <stdlib.h>
  1831. X#endif
  1832. X#ifdef MALLOC_H
  1833. X#include <malloc.h>
  1834. X#endif
  1835. X
  1836. X#include "token.h"
  1837. X#include "comp.h"
  1838. X
  1839. X#define isnormal(ch) (isalnum(ch) || (ch) == '_')
  1840. X
  1841. Xstruct stmt *get_stmt()
  1842. X{
  1843. X    char input[500];
  1844. X    char token[TOKENSIZE];
  1845. X    struct stmt *first = NULL, *sp = NULL, *tail = NULL;
  1846. X    int pos = 0;
  1847. X    int nesting = 1;
  1848. X    
  1849. X    if (GetTokNC(token) == NULL) {
  1850. X    error("premature end of file fot C-statement");
  1851. X    return NULL;
  1852. X    }
  1853. X    
  1854. X    if (strcmp(token, "{") != 0) {
  1855. X        error("expected '{' for C-statement");
  1856. X        return NULL;
  1857. X    }
  1858. X    
  1859. X    for(;;) {
  1860. X        if (GetTokNC(token) == NULL) {
  1861. X            error("premature end of file for C-statement");
  1862. X            return NULL;
  1863. X        }
  1864. X        
  1865. X    if (strcmp(token, "{") == 0) nesting++;
  1866. X    else if (strcmp(token, "}") == 0) nesting--;
  1867. X    
  1868. X    if (newline || nesting == 0) {
  1869. X        if (pos != 0) {
  1870. X            sp = memalloc(offsetof(struct stmt, txt[strlen(input) + 1]));
  1871. X            sp->line = line - newline;
  1872. X            strcpy(sp->txt, input);
  1873. X            sp->next = NULL;
  1874. X            if (first == NULL) {
  1875. X                first = sp;
  1876. X            }
  1877. X            else {
  1878. X                tail->next = sp;
  1879. X            }
  1880. X            tail = sp;
  1881. X        }
  1882. X        if (nesting == 0) break;
  1883. X        
  1884. X        pos = (nesting - 1) * 4; /* indentation */
  1885. X        memset(input, ' ', pos);
  1886. X        input[pos] = 0;
  1887. X    }
  1888. X    
  1889. X    if (pos != 0 && isnormal(token[0]) && isnormal(input[pos - 1])) {
  1890. X        strcpy(input + pos, " ");
  1891. X        pos += 1;
  1892. X    }
  1893. X    strcpy(input + pos, token);
  1894. X    pos += strlen(token);
  1895. X    }
  1896. X    return first;
  1897. X}
  1898. X
  1899. Xvoid unget_stmt(struct stmt *sp)
  1900. X{
  1901. X    struct stmt *next;
  1902. X    
  1903. X    for(; sp != NULL; sp = next) {
  1904. X        next = sp->next;
  1905. X        free(sp);
  1906. X    }
  1907. X}    
  1908. X    
  1909. X    
  1910. END_OF_FILE
  1911. if test 2158 -ne `wc -c <'src/get_stmt.c'`; then
  1912.     echo shar: \"'src/get_stmt.c'\" unpacked with wrong size!
  1913. fi
  1914. # end of 'src/get_stmt.c'
  1915. fi
  1916. if test -f 'src/get_viewport.c' -a "${1}" != "-c" ; then 
  1917.   echo shar: Will not clobber existing file \"'src/get_viewport.c'\"
  1918. else
  1919. echo shar: Extracting \"'src/get_viewport.c'\" \(3066 characters\)
  1920. sed "s/^X//" >'src/get_viewport.c' <<'END_OF_FILE'
  1921. X/*******************************************************************************
  1922. X *
  1923. X *        G E T _ V I E W P O R T . C
  1924. X *        ---------------------------
  1925. X *
  1926. X * Description:
  1927. X *    Compiles a viewport statement.
  1928. X *
  1929. X * Included functions:
  1930. X *    get_viewport    - Does the job
  1931. X *
  1932. X * Revision:
  1933. X *    Ver    Date    By        Reason
  1934. X *    ---    ----    --        ------
  1935. X *    1.00    900619    Lars Berntzon    Created
  1936. X *
  1937. X ******************************************************************************/
  1938. X
  1939. X#include "config.h"
  1940. X
  1941. X#include <stdio.h>
  1942. X#include <ctype.h>
  1943. X#include <string.h>
  1944. X#ifdef STDLIB_H
  1945. X#include <stdlib.h>
  1946. X#endif
  1947. X#ifdef MALLOC_H
  1948. X#include <malloc.h>
  1949. X#endif
  1950. X
  1951. X#include "token.h"
  1952. X#include "comp.h"
  1953. X
  1954. X#define isnormal(ch) (isalnum(ch) || (ch) == '_')
  1955. X
  1956. Xstatic int found_pos();
  1957. Xstatic int found_size();
  1958. X
  1959. Xstatic struct lookup_s lookup[] = {
  1960. X    "POS",  found_pos,
  1961. X    "SIZE", found_size
  1962. X};
  1963. X
  1964. Xstruct viewport *get_viewport()
  1965. X{
  1966. X    char token[TOKENSIZE];
  1967. X    struct viewport *vp = NULL;
  1968. X    int i;
  1969. X    
  1970. X    if (GetTokNC(token) == NULL || !isnormal(token[0])) {
  1971. X        error("expected name of viewport");
  1972. X        return NULL;
  1973. X    }
  1974. X    
  1975. X    vp = memalloc(sizeof *vp);
  1976. X    link_name(&vp->link, token);
  1977. X    
  1978. X    if(GetTokNC(token) == NULL || strcmp(token, "{")) {
  1979. X        error("expected '{'");
  1980. X        unget_viewport(vp);
  1981. X        return NULL;
  1982. X    }
  1983. X    
  1984. X    while(GetTokNC(token) != NULL) {
  1985. X        if (strcmp(token, "}") == 0) break;
  1986. X        
  1987. X    for(i = 0; i < N_CMDS; i++) {
  1988. X        if(strequ(token, lookup[i].cmd) == 0) break;
  1989. X    }
  1990. X    if (i < N_CMDS) {
  1991. X        if ((*lookup[i].func)(vp) != OK) {
  1992. X            unget_viewport(vp);
  1993. X            return NULL;
  1994. X        }
  1995. X    }
  1996. X    else {
  1997. X        fprintf(stderr, "line %d: unknown token '%s'\n", line, token);
  1998. X    }
  1999. X    }
  2000. X    return vp;
  2001. X}
  2002. X
  2003. Xstruct viewport *unget_viewport(struct viewport *vp)
  2004. X{
  2005. X    struct viewport *next;
  2006. X
  2007. X    if (vp == NULL) return NULL;
  2008. X    
  2009. X    next = (struct viewport *)vp->link.next;
  2010. X    if (vp->link.name) free(vp->link.name);
  2011. X    free(vp);
  2012. X    return next;
  2013. X}
  2014. X
  2015. Xstatic int found_pos(vp)
  2016. X    struct viewport *vp;
  2017. X{
  2018. X    char token[TOKENSIZE];
  2019. X    
  2020. X    if (!GetTokNC(token) || !isdigit(token[0])) {
  2021. X        error("expected column");
  2022. X        return FAIL;
  2023. X    }
  2024. X    vp->pos.x = atoi(token);
  2025. X    
  2026. X    if(!GetTokNC(token) || strcmp(token, ",")) {
  2027. X        error("expected ','");
  2028. X        return FAIL;
  2029. X    }
  2030. X    if (!GetTokNC(token) || !isdigit(token[0])) {
  2031. X        error("expected row");
  2032. X        return FAIL;
  2033. X    }
  2034. X    vp->pos.y = atoi(token);
  2035. X    if (!GetTokNC(token) || strcmp(token, ";")) {
  2036. X        error("expected row");
  2037. X        return FAIL;
  2038. X    }
  2039. X    return OK;
  2040. X}
  2041. X
  2042. Xstatic int found_size(vp)
  2043. X    struct viewport *vp;
  2044. X{
  2045. X    char token[TOKENSIZE];
  2046. X    
  2047. X    if (!GetTokNC(token) || !isdigit(token[0])) {
  2048. X        error("expected column");
  2049. X        return FAIL;
  2050. X    }
  2051. X    vp->size.x = atoi(token);
  2052. X    
  2053. X    if(!GetTokNC(token) || strcmp(token, ",")) {
  2054. X        error("expected ','");
  2055. X        return FAIL;
  2056. X    }
  2057. X
  2058. X    if (!GetTokNC(token) || !isdigit(token[0])) {
  2059. X        error("expected row");
  2060. X        return FAIL;
  2061. X    }
  2062. X    vp->size.y = atoi(token);
  2063. X    if (!GetTokNC(token) || strcmp(token, ";")) {
  2064. X        error("expected row");
  2065. X        return FAIL;
  2066. X    }
  2067. X    return OK;
  2068. X}
  2069. X
  2070. END_OF_FILE
  2071. if test 3066 -ne `wc -c <'src/get_viewport.c'`; then
  2072.     echo shar: \"'src/get_viewport.c'\" unpacked with wrong size!
  2073. fi
  2074. # end of 'src/get_viewport.c'
  2075. fi
  2076. if test -f 'src/keys.h' -a "${1}" != "-c" ; then 
  2077.   echo shar: Will not clobber existing file \"'src/keys.h'\"
  2078. else
  2079. echo shar: Extracting \"'src/keys.h'\" \(5569 characters\)
  2080. sed "s/^X//" >'src/keys.h' <<'END_OF_FILE'
  2081. X    "BS",        "'\\b'",
  2082. X    "CR",        "'\\n'",
  2083. X    "TAB",        "'\t'",
  2084. X    "BREAK",        "KEY_BREAK", /* break key (unreliable) */
  2085. X    "DOWN",        "KEY_DOWN", /* Sent by terminal down arrow key */
  2086. X    "UP",        "KEY_UP", /* Sent by terminal up arrow key */
  2087. X    "LEFT",        "KEY_LEFT", /* Sent by terminal left arrow key */
  2088. X    "RIGHT",        "KEY_RIGHT", /* Sent by terminal right arrow key */
  2089. X    "HOME",        "KEY_HOME", /* Sent by home key. */
  2090. X    "BACKSPACE",    "KEY_BACKSPACE", /* Sent by backspace key */
  2091. X    "F0",        "KEY_F0", /* function key f0. */
  2092. X    "F1",            "(KEY_F0+(1))",
  2093. X    "F2",            "(KEY_F0+(2))",
  2094. X    "F3",            "(KEY_F0+(3))",
  2095. X    "F4",            "(KEY_F0+(4))",
  2096. X    "F5",            "(KEY_F0+(5))",
  2097. X    "F6",            "(KEY_F0+(6))",
  2098. X    "F7",            "(KEY_F0+(7))",
  2099. X    "F8",            "(KEY_F0+(8))",
  2100. X    "F9",            "(KEY_F0+(9))",
  2101. X    "F10",            "(KEY_F0+(10))",
  2102. X    "F11",            "(KEY_F0+(11))",
  2103. X    "F12",            "(KEY_F0+(12))",
  2104. X    "F13",            "(KEY_F0+(13))",
  2105. X    "F14",            "(KEY_F0+(14))",
  2106. X    "F15",            "(KEY_F0+(15))",
  2107. X    "F16",            "(KEY_F0+(16))",
  2108. X    "F17",            "(KEY_F0+(17))",
  2109. X    "F18",            "(KEY_F0+(18))",
  2110. X    "F19",            "(KEY_F0+(19))",
  2111. X    "F20",            "(KEY_F0+(20))",
  2112. X    "DL",        "KEY_DL", /* Sent by delete line key. */
  2113. X    "IL",        "KEY_IL", /* Sent by insert line. */
  2114. X    "DC",        "KEY_DC", /* Sent by delete character key. */
  2115. X    "IC",        "KEY_IC", /* Sent by ins char/enter ins mode key. */
  2116. X    "EIC",        "KEY_EIC", /* Sent by rmir or smir in insert mode. */
  2117. X    "CLEAR",        "KEY_CLEAR", /* Sent by clear screen or erase key. */
  2118. X    "EOS",        "KEY_EOS", /* Sent by clear-to-end-of-screen key. */
  2119. X    "EOL",        "KEY_EOL", /* Sent by clear-to-end-of-line key. */
  2120. X    "SF",        "KEY_SF", /* Sent by scroll-forward/down key */
  2121. X    "SR",        "KEY_SR", /* Sent by scroll-backward/up key */
  2122. X    "NPAGE",        "KEY_NPAGE", /* Sent by next-page key */
  2123. X    "PPAGE",        "KEY_PPAGE", /* Sent by previous-page key */
  2124. X    "STAB",        "KEY_STAB", /* Sent by set-tab key */
  2125. X    "CTAB",        "KEY_CTAB", /* Sent by clear-tab key */
  2126. X    "CATAB",        "KEY_CATAB", /* Sent by clear-all-tabs key. */
  2127. X    "ENTER",        "KEY_ENTER", /* Enter/send (unreliable) */
  2128. X    "SRESET",        "KEY_SRESET", /* soft (partial) reset (unreliable) */
  2129. X    "RESET",        "KEY_RESET", /* reset or hard reset (unreliable) */
  2130. X    "PRINT",        "KEY_PRINT", /* print or copy */
  2131. X    "LL",        "KEY_LL", /* Sent by home-down key */
  2132. X                    /* The keypad is arranged like this: */
  2133. X                    /*    a1    up    a3   */
  2134. X                    /*   left   b2  right  */
  2135. X                    /*    c1   down   c3   */
  2136. X    "A1",        "KEY_A1", /* Upper left of keypad */
  2137. X    "A3",        "KEY_A3", /* Upper right of keypad */
  2138. X    "B2",        "KEY_B2", /* Center of keypad */
  2139. X    "C1",        "KEY_C1", /* Lower left of keypad */
  2140. X    "C3",        "KEY_C3", /* Lower right of keypad */
  2141. X    "BTAB",        "KEY_BTAB", /* Back tab key */
  2142. X    "BEG",        "KEY_BEG", /* beg(inning) key */
  2143. X    "CANCEL",        "KEY_CANCEL", /* cancel key */
  2144. X    "CLOSE",        "KEY_CLOSE", /* close key */
  2145. X    "COMMAND",        "KEY_COMMAND", /* cmd (command) key */
  2146. X    "COPY",        "KEY_COPY", /* copy key */
  2147. X    "CREATE",        "KEY_CREATE", /* create key */
  2148. X    "END",        "KEY_END", /* end key */
  2149. X    "EXIT",        "KEY_EXIT", /* exit key */
  2150. X    "FIND",        "KEY_FIND", /* find key */
  2151. X    "HELP",        "KEY_HELP", /* help key */
  2152. X    "MARK",        "KEY_MARK", /* mark key */
  2153. X    "MESSAGE",        "KEY_MESSAGE", /* message key */
  2154. X    "MOVE",        "KEY_MOVE", /* move key */
  2155. X    "NEXT",        "KEY_NEXT", /* next object key */
  2156. X    "OPEN",        "KEY_OPEN", /* open key */
  2157. X    "OPTIONS",        "KEY_OPTIONS", /* options key */
  2158. X    "PREVIOUS",    "KEY_PREVIOUS", /* previous object key */
  2159. X    "REDO",        "KEY_REDO", /* redo key */
  2160. X    "REFERENCE",    "KEY_REFERENCE", /* ref(erence) key */
  2161. X    "REFRESH",        "KEY_REFRESH", /* refresh key */
  2162. X    "REPLACE",        "KEY_REPLACE", /* replace key */
  2163. X    "RESTART",        "KEY_RESTART", /* restart key */
  2164. X    "RESUME",        "KEY_RESUME", /* resume key */
  2165. X    "SAVE",        "KEY_SAVE", /* save key */
  2166. X    "SBEG",        "KEY_SBEG", /* shifted beginning key */
  2167. X    "SCANCEL",        "KEY_SCANCEL", /* shifted cancel key */
  2168. X    "SCOMMAND",    "KEY_SCOMMAND", /* shifted command key */
  2169. X    "SCOPY",        "KEY_SCOPY", /* shifted copy key */
  2170. X    "SCREATE",        "KEY_SCREATE", /* shifted create key */
  2171. X    "SDC",        "KEY_SDC", /* shifted delete char key */
  2172. X    "SDL",        "KEY_SDL", /* shifted delete line key */
  2173. X    "SELECT",        "KEY_SELECT", /* select key */
  2174. X    "SEND",        "KEY_SEND", /* shifted end key */
  2175. X    "SEOL",        "KEY_SEOL", /* shifted clear line key */
  2176. X    "SEXIT",        "KEY_SEXIT", /* shifted exit key */
  2177. X    "SFIND",        "KEY_SFIND", /* shifted find key */
  2178. X    "SHELP",        "KEY_SHELP", /* shifted help key */
  2179. X    "SHOME",        "KEY_SHOME", /* shifted home key */
  2180. X    "SIC",        "KEY_SIC", /* shifted input key */
  2181. X    "SLEFT",        "KEY_SLEFT", /* shifted left arrow key */
  2182. X    "SMESSAGE",    "KEY_SMESSAGE", /* shifted message key */
  2183. X    "SMOVE",        "KEY_SMOVE", /* shifted move key */
  2184. X    "SNEXT",        "KEY_SNEXT", /* shifted next key */
  2185. X    "SOPTIONS",    "KEY_SOPTIONS", /* shifted options key */
  2186. X    "SPREVIOUS",    "KEY_SPREVIOUS", /* shifted prev key */
  2187. X    "SPRINT",        "KEY_SPRINT", /* shifted print key */
  2188. X    "SREDO",        "KEY_SREDO", /* shifted redo key */
  2189. X    "SREPLACE",    "KEY_SREPLACE", /* shifted replace key */
  2190. X    "SRIGHT",        "KEY_SRIGHT", /* shifted right arrow */
  2191. X    "SRSUME",        "KEY_SRSUME", /* shifted resume key */
  2192. X    "SSAVE",        "KEY_SSAVE", /* shifted save key */
  2193. X    "SSUSPEND",    "KEY_SSUSPEND", /* shifted suspend key */
  2194. X    "SUNDO",        "KEY_SUNDO", /* shifted undo key */
  2195. X    "SUSPEND",        "KEY_SUSPEND", /* suspend key */
  2196. X    "UNDO",        "KEY_UNDO", /* undo key */
  2197. X    "MOUSE",        "KEY_MOUSE", /* Mouse event has occured */
  2198. END_OF_FILE
  2199. if test 5569 -ne `wc -c <'src/keys.h'`; then
  2200.     echo shar: \"'src/keys.h'\" unpacked with wrong size!
  2201. fi
  2202. # end of 'src/keys.h'
  2203. fi
  2204. if test -f 'src/skip_stmt.c' -a "${1}" != "-c" ; then 
  2205.   echo shar: Will not clobber existing file \"'src/skip_stmt.c'\"
  2206. else
  2207. echo shar: Extracting \"'src/skip_stmt.c'\" \(1238 characters\)
  2208. sed "s/^X//" >'src/skip_stmt.c' <<'END_OF_FILE'
  2209. X/******************************************************************************
  2210. X *
  2211. X *        S K I P _ S T M T . C
  2212. X *        ---------------------
  2213. X *
  2214. X * Description:
  2215. X *    Skips a C-statement block.
  2216. X *
  2217. X * Included functions:
  2218. X *    skip_stmt    - Does the job
  2219. X *
  2220. X * Revision:
  2221. X *    Ver    Date    By        Reason
  2222. X *    ---    ----    --        ------
  2223. X *    1.00    900625    Lars Berntzon    Created
  2224. X *
  2225. X ******************************************************************************/
  2226. X
  2227. X#include "config.h"
  2228. X
  2229. X#include <stdio.h>
  2230. X#include <ctype.h>
  2231. X#include <string.h>
  2232. X#ifdef STDLIB_H
  2233. X#include <stdlib.h>
  2234. X#endif
  2235. X#ifdef MALLOC_H
  2236. X#include <malloc.h>
  2237. X#endif
  2238. X
  2239. X#include "token.h"
  2240. X#include "comp.h"
  2241. X
  2242. X#define isnormal(ch) (isalnum(ch) || (ch) == '_')
  2243. X
  2244. Xskip_stmt()
  2245. X{
  2246. X    char token[TOKENSIZE];
  2247. X    int nesting;
  2248. X    
  2249. X    if (GetTokNC(token) == NULL) {
  2250. X        error("premature end of file for C-statement");
  2251. X        return FAIL;
  2252. X    }
  2253. X
  2254. X    if (strcmp(token, "{") != 0) {
  2255. X        error("expected '{' for C-statement");
  2256. X        return FAIL;
  2257. X    }
  2258. X    
  2259. X    for(nesting = 1; nesting != 0;) {
  2260. X        if(GetTokNC(token) == NULL) {
  2261. X            error("premature end of file for C-statement");
  2262. X            return FAIL;
  2263. X        }
  2264. X        
  2265. X    if (strcmp(token, "{") == 0) nesting++;
  2266. X    else if (strcmp(token, "}") == 0) nesting--;
  2267. X    }
  2268. X
  2269. X    return OK;
  2270. X} 
  2271. END_OF_FILE
  2272. if test 1238 -ne `wc -c <'src/skip_stmt.c'`; then
  2273.     echo shar: \"'src/skip_stmt.c'\" unpacked with wrong size!
  2274. fi
  2275. # end of 'src/skip_stmt.c'
  2276. fi
  2277. if test -f 'src/token.h' -a "${1}" != "-c" ; then 
  2278.   echo shar: Will not clobber existing file \"'src/token.h'\"
  2279. else
  2280. echo shar: Extracting \"'src/token.h'\" \(1004 characters\)
  2281. sed "s/^X//" >'src/token.h' <<'END_OF_FILE'
  2282. X/*******************************************************************************
  2283. X *
  2284. X *        T O K E N . H
  2285. X *        -------------
  2286. X *
  2287. X * Description:
  2288. X *    Includefile for token routines.
  2289. X *
  2290. X * Revision:
  2291. X *    Ver    Date     By        Reason
  2292. X *    ---    ----     --        ------
  2293. X *    1.00   900619    Lars Berntzon    Created
  2294. X *
  2295. X ******************************************************************************/
  2296. X
  2297. X
  2298. X    /* D e f i n i t i o n s */
  2299. X
  2300. X#define TOKENSIZE 200        /* Maximal size of a token              */
  2301. X
  2302. X
  2303. X    /* G l o b a l   v a r i a b l e s */
  2304. X
  2305. Xextern int newline;        /* Number of newlines before this token       */
  2306. Xextern int line;        /* Current line number                  */
  2307. Xextern FILE *in;        /* Input file set by OpenTok()              */
  2308. X
  2309. X
  2310. X    /* G l o b a l   f u n c t i o n s */
  2311. X
  2312. Xextern char *GetTok(char *token);    /* Get one token              */
  2313. Xextern char *GetTokNC(char *token);    /* Get token but skip comment          */
  2314. Xextern void UnGetTok(char *token);    /* Push back one token              */
  2315. Xextern FILE *OpenTok(char *filename);    /* Open file for input             */
  2316. END_OF_FILE
  2317. if test 1004 -ne `wc -c <'src/token.h'`; then
  2318.     echo shar: \"'src/token.h'\" unpacked with wrong size!
  2319. fi
  2320. # end of 'src/token.h'
  2321. fi
  2322. echo shar: End of archive 1 \(of 3\).
  2323. cp /dev/null ark1isdone
  2324. MISSING=""
  2325. for I in 1 2 3 ; do
  2326.     if test ! -f ark${I}isdone ; then
  2327.     MISSING="${MISSING} ${I}"
  2328.     fi
  2329. done
  2330. if test "${MISSING}" = "" ; then
  2331.     echo You have unpacked all 3 archives.
  2332.     rm -f ark[1-9]isdone
  2333. else
  2334.     echo You still need to unpack the following archives:
  2335.     echo "        " ${MISSING}
  2336. fi
  2337. ##  End of shell archive.
  2338. exit 0
  2339.